/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fi.ahola.tietorekisteri;

import java.io.*;

/**
 * Luokka sisältää kohdetiedoston käsittelyyn liittyviä metodeja.
 *
 * @author f0899
 */
public class TiedostonKasittely {

    private String tiedosto;
    private FileInputStream inFile;
    private FileOutputStream outFile;
    private ObjectOutputStream outObj;
    private ObjectInputStream inObj;
    private File tiedFile;

    /**
     * Luokan Konstruktori
     */
    public TiedostonKasittely() {
    }

    /**
     * Asettaa kohdetiedoston sijainnin.
     *
     * @param tied Kohdetiedoston sijainti
     */
    public void asetaKohde(String tied) {
        tiedosto = tied;
    }

    /**
     * Palauttaa Maatila-olion minkä sisältö luetaan kohdetiedostosta.
     *
     * @return Maatila-olio joka ladattiin kohdetiedostosta
     * @throws Exception Virhe tiedoston avauksessa tai olion lukemisessa
     * @see #asetaKohde(java.lang.String)
     */
    public Maatila avaaTiedosto() throws Exception {
        Maatila maati = new Maatila();
        inFile = new FileInputStream(tiedosto + ".dat");
        inObj = new ObjectInputStream(inFile);
        maati = (Maatila) inObj.readObject();
        inObj.close();
        return maati;
    }

    /**
     * Tallentaa Maatila-olion kohdetiedostoon.
     *
     * @param maati Maatila-olio joka tallennetaan
     * @throws Exception Virhe tiedostoon tallennettaessa
     * @see #asetaKohde(java.lang.String)
     */
    public void tallennaTiedosto(Maatila maati) throws Exception {

        outFile = new FileOutputStream(tiedosto + ".dat");
        outObj = new ObjectOutputStream(outFile);
        outObj.writeObject(maati);
        outObj.close();
    }

    /**
     * Poistaa tiedoston.
     *
     * @param tied Tiedosto joka poistetaan levyltä
     */
    public void poistaTiedosto(String tied) {
        File poista = new File(tied);
        poista.delete();
        poista = null;
    }

    /**
     * Tarkistaa löytyykö tiedostoa levyltä. Palauttaa Boolean-arvon true
     * tiedoston löytyessä ja Boolean-arvon false mikäli tiedostoa ei löydy.
     *
     * @param tied Tiedosto jonka olemassaolo tarkistetaan
     * @return Boolean-arvo tiedoston olemassaolosta
     */
    public boolean onkoOlemassa(String tied) {
        File onko = new File(tied);
        if (onko.exists()) {
            onko = null;
            return true;
        }
        onko = null;
        return false;
    }

    /**
     * Palauttaa viimeksi käytetyn tiedostonimen. Tiedostonimi sijaitsee
     * lastMaatila-tiedoston ensimmäisellä rivillä. Palauttaa arvon Stringinä.
     *
     * @return String-arvo joka palautettiin lastMaatila:n ensimmäiseltä riviltä
     * @throws FileNotFoundException Virhe: lastMaatila-tiedostoa ei löytynyt
     * @throws IOException Virhe: sisäinen tiedostonkäsittelyvirhe
     */
    public String lueEdellinenMaatila() throws FileNotFoundException, IOException {
        File edFile = new File("lastMaatila");
        FileReader edR = new FileReader(edFile);
        LineNumberReader lineNR = new LineNumberReader(edR);
        String edellMaatila = null;

        while (lineNR.getLineNumber() == 0) {
            edellMaatila = lineNR.readLine();
        }
        return edellMaatila;
    }

    /**
     * Tallentaa viimeksi käytetyn tiedostonimen. Tiedostonimi sijaitsee
     * lastMaatila-tiedoston ensimmäisellä rivillä.
     *
     * @param tied Viimeksi käytetty tiedostonimi
     * @throws IOException Virhe: sisäinen tiedostonkäsittelyvirhe
     */
    public void tallennaEdellinenMaatila(String tied) throws IOException {
        Writer kirjoitin = new FileWriter("lastMaatila");
        kirjoitin.write(tied);
        kirjoitin.close();
    }

    //Metodi tarkistaa mitkä tiedostot on olemassa ja raportoi int:inä tuloksen
    /**
     * Metodi tarkistaa onko annettuja tiedostoja olemassa ja palauttaa tuloksen integerinä.
     * 1 = p1 löytyy ja p2 ei löydy
     * 2 = p1 löytyy ja p2 löytyy tai p1 löytyy ja p2 löytyy ja p1 ei löydy
     * 3 = p1 ei löydy ja p2 ei löydy
     * 
     * @param p1 
     * @param p2 
     * @return
     */
    public int tarkistaTiedostot(String p1, String p2) {
        if (this.onkoOlemassa(tiedosto + p1)) {
            if (!this.onkoOlemassa(tiedosto + p2)) {
                return 1;
            } else if (this.onkoOlemassa(tiedosto + p2)) {
                return 2;
            }
        }
        if (this.onkoOlemassa(tiedosto + p2)) {
            if (!this.onkoOlemassa(tiedosto + p1)) {
                return 2;
            }
        }
        if (!this.onkoOlemassa(tiedosto + p2)) {
            if (!this.onkoOlemassa(tiedosto + p1)) {
                return 3;
            }
        }
        return -1;
    }
}
